上面的博文介绍的都是源码src下的基础模块zepto.js
文件和事件模块event.js
,下面接着看另外一个独立的模块–ajax模块ajax.js
代码挂在我的github上,对应文件夹v0.4.1。
https://github.com/zrysmt/DIY-zepto
1.ajax的过程
- 当global: true时。在Ajax请求生命周期内,以下这些事件将被触发。
- ajaxStart (global):如果没有其他Ajax请求当前活跃将会被触发。
- ajaxBeforeSend (data: xhr, options):再发送请求前,可以被取消。
- ajaxSend (data: xhr, options):像 ajaxBeforeSend,但不能取消。
- ajaxSuccess (data: xhr, options, data):当返回成功时。
- ajaxError (data: xhr, options, error):当有错误时。
- ajaxComplete (data: xhr, options):请求已经完成后,无论请求是成功或者失败。
- ajaxStop (global):如果这是最后一个活跃着的Ajax请求,将会被触发。
下面我们就首先来看这些过程的源码:
- 实现逻辑函数:
1 | // trigger a custom event and return false if it was cancelled |
ajaxStart
1 | //如果没有其他Ajax请求当前活跃将会被触发 |
ajaxBeforeSend
1 | // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable |
ajaxSuccess
1 | function ajaxSuccess(data, xhr, settings, deferred) { |
ajaxError
1 | // type: "timeout", "error", "abort", "parsererror" |
ajaxComplete
1 | // status: "success", "notmodified", "error", "timeout", "abort", "parsererror" |
ajaxStop
1 | // 所有ajax请求都完成后才触发 |
我们注意到,我们只是自定义了ajaxXXX事件,并没有实际的意义,这时候我们就需要将这些事件的逻辑实现。这部分逻辑放在了$.ajax
中,在适当的时候触发事件,这些很值得我们去思考的它的巧妙。
2.$.ajax
2.1 全局变量,工具函数定义:
1 | var jsonpID = +new Date(), |
2.2 $.ajaxSetting
1 | $.ajaxSettings = { |
2.3 序列化
1 | // 列化data参数,并且如果是GET方法的话把参数添加到url参数上 |
1 | var escape = encodeURIComponent; |
2.4 XMLHttpRequest解释
常用方法:
函数/属性 | 作用 |
---|---|
setRequestHeader() | 给指定的HTTP请求头赋值.在这之前,你必须确认已经调用 open() 方法打开了一个url |
overrideMimeType() | 重写由服务器返回的MIME type |
onreadystatechange | readyState属性改变时会调用它 |
open() | 初始化一个请求 |
send() | 发送请求. 如果该请求是异步模式(默认),该方法会立刻返回. 相反,如果请求是同步模式,则直到请求的响应完全接受以后,该方法才会返回 |
readyState的状态:
值 | 状态 | 描述 |
---|---|---|
0 |
UNSENT (未打开) |
open() 方法还未被调用. |
1 |
OPENED (未发送) |
send() 方法还未被调用. |
2 |
HEADERS_RECEIVED (已获取响应头) |
send() 方法已经被调用, 响应头和响应状态已经返回. |
3 |
LOADING (正在下载响应体) |
响应体下载中; responseText 中已经获取了部分数据. |
4 |
DONE (请求完成) |
整个请求过程已经完毕. |
2.5 $.ajax
实现
1 | $.ajax = function(options) { |
2.6 示例Demo
ajax读取本地的json,安装个小服务器,或者使用其他服务器,如apache,tomcat等。1
2npm install anywhere -g //安装
anywhere 8860 //开启端口(任意没被占用的)为服务器使用
1 | $.ajax({ |
3.jsonp
使用jsonp跨域的核心思想是:
1 | script = document.createElement('script') |
具体实现的代码:
1 | $.ajaxJSONP = function(options, deferred) { |
4.get、post、getJSON、load 方法
篇幅所限,这里就不再单列出来了,他们都是处理好参数,调用$.ajax
方法。详细的实现方式去我的github 下载。
全部代码挂在我的github上,本博文对应文件夹v0.4.x。
https://github.com/zrysmt/DIY-zepto
参考阅读: